home *** CD-ROM | disk | FTP | other *** search
/ PC User 2003 January / Disc 1 / PCU0103CD1.iso / entertn / demos / files / aomtrial.exe / AOM / AI / SCN29P7.XS < prev    next >
Encoding:
Text File  |  2002-09-11  |  12.6 KB  |  369 lines

  1. //==============================================================================
  2. // Scn29p7: AI Scenario Script for scenario 29 player 7
  3. //==============================================================================
  4. /*
  5.    AI owner:  Dave Leary
  6.    Scenario owner: Joe Gillum/Jerome Jones
  7.  
  8.    Difficulty Level Notes: Trains ballistae in increasing numbers on higher
  9.     levels.  Size of giant armies is also increased.
  10. */
  11. //==============================================================================
  12. // Difficulty Level check predeclared.
  13. //==============================================================================
  14. int difflevel=-1;        
  15.  
  16. // Variable for main base.
  17. int gMainBaseID=-1;
  18.  
  19. //Shared variables.
  20. int numberAttacks=0;
  21. int attackPlayerID=-1;
  22.  
  23. //Attack 1 vars.
  24. int attackPlan1ID=-1;
  25. int maintainPlan1ID=-1;
  26.  
  27. // Route and path vars.
  28. int attackRoute1ID=-1;
  29. int attackPath1ID=-1;
  30.  
  31. // Unit types
  32. int attackerUnitTypeID1=cUnitTypeMountainGiant;
  33. int attackerUnitTypeID2=cUnitTypeFrostGiant;
  34.  
  35. //==============================================================================
  36. // Set Town Location
  37. //==============================================================================
  38. void setTownLocation(void)
  39. {
  40.    //Look for the "Town Location" marker.
  41.    kbSetTownLocation(kbGetBlockPosition("365585"));
  42. }
  43.  
  44. //==============================================================================
  45. // miscStartup
  46. //==============================================================================
  47. void miscStartup(void)
  48. {
  49.     // Get the difficulty level.
  50.     difflevel=aiGetWorldDifficulty();
  51.  
  52.    //Startup message(s).
  53.    aiEcho("");
  54.    aiEcho("");
  55.    aiEcho("Scn29P7 AI Start, filename='"+cFilename+"'.");
  56.    //Spit out the map size.
  57.    aiEcho("Map size is ("+kbGetMapXSize()+", "+kbGetMapZSize()+").");
  58.     aiEcho("Difficulty Level="+difflevel+".");
  59.  
  60.    //Cheat like a bastard.  Once only, though.
  61.    kbLookAtAllUnitsOnMap();
  62.    //Calculate some areas.
  63.    kbAreaCalculate(1200.0);
  64.    //Set our town location.
  65.    setTownLocation();
  66.     
  67.     //Allocate all resources to the root escrow by setting percentage of military/economy to 0.
  68.     kbEscrowSetPercentage( cEconomyEscrowID, cAllResources, 0.0 );
  69.     kbEscrowSetPercentage( cMilitaryEscrowID, cAllResources, 0.0 );
  70.  
  71.     //Allocate all resources 
  72.    kbEscrowAllocateCurrentResources();
  73.  
  74.     //Reset random seed
  75.     aiRandSetSeed();
  76.  
  77.     // Diff level adjustments
  78.     if ( difflevel > 0 )
  79.     {
  80.         attackerUnitTypeID2=cUnitTypeMountainGiant;
  81.     }
  82.  
  83.     if ( difflevel > 1 )
  84.     {
  85.         attackerUnitTypeID1=cUnitTypeMountainGiant;
  86.         attackerUnitTypeID2=cUnitTypeFireGiant;
  87.     }
  88.  
  89.     if ( difflevel == 3 )
  90.     {
  91.         attackerUnitTypeID1=cUnitTypeFireGiant;
  92.         attackerUnitTypeID2=cUnitTypeFrostGiant;
  93.     }
  94. }
  95.  
  96. //==============================================================================
  97. //==============================================================================
  98. // Attack stuff.
  99. //==============================================================================
  100. //==============================================================================
  101.  
  102. //==============================================================================
  103. // initAttack: Creates attack routes, etc.
  104. //==============================================================================
  105. void initAttack(int playerID=-1)
  106. {
  107.    //Destroy all previous attacks (if this isn't the player we're already attacking.
  108.    if (playerID != attackPlayerID)
  109.    {
  110.       //Reset the attack player ID.
  111.       attackPlayerID=-1;
  112.       //Destroy any previous attack plan.
  113.       aiPlanDestroy(attackPlan1ID);
  114.       attackPlan1ID=-1;
  115.  
  116.       //Destroy our previous attack paths.
  117.       kbPathDestroy(attackPath1ID);
  118.       attackPath1ID=-1;
  119.  
  120.       //Destroy our previous attack routes.  
  121.       attackRoute1ID=-1;
  122.  
  123.       //Reset the number of attacks.
  124.       numberAttacks=0;
  125.    }
  126.  
  127.    //Save the player to attack.
  128.    attackPlayerID=playerID;
  129.  
  130.    vector gatherPoint=kbGetBlockPosition("365585");
  131.    
  132.     //Setup attack path 1 - go left
  133.    attackPath1ID=kbPathCreate("Attack Path 1");
  134.    kbPathAddWaypoint(attackPath1ID, kbGetBlockPosition("365586"));
  135.    //Create attack route 1.
  136.    attackRoute1ID=kbCreateAttackRouteWithPath("Attack Route 1", gatherPoint, kbGetBlockPosition("365587"));
  137.    
  138.     if (attackRoute1ID >= 0)
  139.       kbAttackRouteAddPath(attackRoute1ID, attackPath1ID);
  140.  
  141. }
  142.  
  143. //==============================================================================
  144. // setupBaseAttack - the primary attack setup.
  145. // Prioritizes enemy units instead of buildings.
  146. //==============================================================================
  147. bool setupBaseAttack(int playerID=-1)
  148. {
  149.     difflevel=aiGetWorldDifficulty();
  150.  
  151.    // If we have enough unassigned military units of the core type, bail.
  152.    int numberAvailableUnits1=aiNumberUnassignedUnits(attackerUnitTypeID1);
  153.     vector gatherPoint=kbGetBlockPosition("365585");
  154.    
  155.     // Bail if things ain't looking right, to avoid nasty idle attack plans.
  156.     aiEcho("There are "+numberAvailableUnits1+" base giants available for a new attack.");
  157.     if (numberAvailableUnits1 < 1)
  158.         return( false );
  159.        
  160.     //Info.
  161.     aiEcho("Attacking Player "+playerID+".");
  162.  
  163.    //If the player to attack doesn't match, init the attack.
  164.    if (attackPlayerID != playerID)
  165.    {
  166.       initAttack(playerID);
  167.       if (attackPlayerID < 0)
  168.          return(false);
  169.    }
  170.  
  171.    //Create an attack plan.
  172.    int newAttackPlanID=aiPlanCreate("Attack Player"+attackPlayerID+" Attempt"+numberAttacks, cPlanAttack);
  173.    if (newAttackPlanID < 0)
  174.       return(false);
  175.  
  176.    //Target player (required).  This must work.
  177.    if (aiPlanSetVariableInt(newAttackPlanID, cAttackPlanPlayerID, 0, attackPlayerID) == false)
  178.       return(false);
  179.  
  180.     //Set the target type.  This must work.
  181.    if (aiPlanSetNumberVariableValues(newAttackPlanID, cAttackPlanTargetTypeID, 2, true) == false)
  182.       return(false);
  183.  
  184.    //Unit types to attack.
  185.    aiPlanSetVariableInt(newAttackPlanID, cAttackPlanTargetTypeID, 0, cUnitTypeBuilding);
  186.     aiPlanSetVariableInt(newAttackPlanID, cAttackPlanTargetTypeID, 1, cUnitTypeUnit);
  187.  
  188.     aiPlanSetVariableInt(newAttackPlanID, cAttackPlanAttackRouteID, 0, attackRoute1ID);
  189.     aiPlanSetVariableVector(newAttackPlanID, cAttackPlanGatherPoint, 0, gatherPoint);
  190.    aiPlanSetInitialPosition(newAttackPlanID, gatherPoint);
  191.  
  192.    //Set the gather point distance
  193.    aiPlanSetVariableFloat(newAttackPlanID, cAttackPlanGatherDistance, 0, 20.0);
  194.  
  195.    //Set up the attack route usage pattern
  196.    aiPlanSetVariableInt(newAttackPlanID, cAttackPlanAttackRoutePattern, 0, cAttackPlanAttackRoutePatternRandom);
  197.    
  198.     //Add the unit types to the plan.  Difflevel affects what's up here.
  199.     if ( difflevel < 2 )
  200.     {
  201.         aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID1, 1, 2, 2);
  202.     }
  203.     else
  204.     {
  205.         aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID1, 1, 4, 4);
  206.     }
  207.  
  208.     if ( difflevel < 3 )
  209.     {
  210.         aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID2, 0, 1, 1);
  211.     }
  212.     else
  213.     {
  214.         aiPlanAddUnitType(newAttackPlanID, attackerUnitTypeID2, 0, 2, 2);
  215.     }
  216.  
  217.     // Add ballista if you got any.
  218.     aiPlanAddUnitType(newAttackPlanID, cUnitTypeBallista, 0, 3, 3);
  219.     
  220.    //Plan requires all need units to work (can be false)
  221.    aiPlanSetRequiresAllNeedUnits(newAttackPlanID, true);
  222.    //Activate the plan.
  223.    aiPlanSetActive(newAttackPlanID);
  224.  
  225.    //Now, save the attack plan ID appropriately
  226.    aiPlanSetOrphan(attackPlan1ID, true);
  227.    attackPlan1ID=newAttackPlanID;
  228.  
  229.    //Increment our overall number of attacks
  230.    numberAttacks++;
  231. }
  232.  
  233. //==============================================================================
  234. // Attack Generator 1 - Base attack, every two minutes, once activated.
  235. //==============================================================================
  236. rule attackGenerator1
  237.    minInterval 150
  238.    inactive
  239.    group AttackRules
  240. {
  241.    // See how many "idle" attack plans we have.  Don't create any more if we have
  242.    // idle plans.
  243.    int numberIdleAttackPlans=aiGetNumberIdlePlans(cPlanAttack);
  244.  
  245.    if (numberIdleAttackPlans > 0)
  246.       return;
  247.  
  248.     setupBaseAttack(1);
  249. }
  250.  
  251. //==============================================================================
  252. // Favor cheat - grant 30 favor every 45 seconds.
  253. //==============================================================================
  254. rule favorCheat
  255.    minInterval 45
  256.    inactive
  257.    group AttackRules
  258. {
  259.     // Cheat for favor.  It's tough to be Norse.
  260.     aiResourceCheat( 7, cResourceFavor, 45.0 );
  261. }
  262.  
  263.  
  264. //==============================================================================
  265. // templeActivate - triggered with an AI FUNC to get everything rolling.
  266. //==============================================================================
  267. void templeActivate( int parameter=-1 )
  268. {
  269.     aiEcho("*** PLAYER 7 AI: Temple activated, training and sending giant groups.");
  270.     // Enable favor generation and training fun.
  271.     xsEnableRule("attackGenerator1");
  272.     xsEnableRule("favorCheat");
  273. }
  274.  
  275. //==============================================================================
  276. // MAIN 
  277. //==============================================================================
  278. void main(void)
  279. {
  280.     difflevel=aiGetWorldDifficulty();
  281.  
  282.    //Startup.
  283.    miscStartup();
  284.  
  285.    //Share a common gather point.
  286.    vector gatherPoint=kbGetBlockPosition("365585");
  287.     vector gatherPoint2=kbGetBlockPosition("367253");
  288.  
  289.    //Maintain 2 of the first giant type...unless diff level is higher.
  290.    int maintainPlan1ID=aiPlanCreate("Maintain 2 "+kbGetProtoUnitName(attackerUnitTypeID1), cPlanTrain);
  291.    if (maintainPlan1ID >= 0)
  292.    {
  293.         //Must set the type of unit to train.
  294.       aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanUnitType, 0, attackerUnitTypeID1);
  295.       //You can limit the number of units that are ever trained by this plan with this call.
  296.       //aiPlanSetVariableInt(maintainPlanID, cTrainPlanNumberToTrain, 0, 25);
  297.       //Set the number of units to maintain in the world at one time.
  298.         if ( difflevel < 2 )
  299.         {
  300.             aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanNumberToMaintain, 0, 2);
  301.         }
  302.         else
  303.         {
  304.             aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanNumberToMaintain, 0, 4);
  305.         }
  306.       //Don't train units faster than every 25 seconds.
  307.         if ( difflevel < 2 )
  308.         {
  309.             aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanFrequency, 0, 60);
  310.         }
  311.         else
  312.         {
  313.             aiPlanSetVariableInt(maintainPlan1ID, cTrainPlanFrequency, 0, 30);
  314.         }
  315.       //Set a gather point.
  316.       aiPlanSetVariableVector(maintainPlan1ID, cTrainPlanGatherPoint, 0, gatherPoint);
  317.       //Activate the plan.
  318.       aiPlanSetActive(maintainPlan1ID);
  319.    }
  320.  
  321.     //Maintain 2 of the second giant type (though we only ever send one in an attack group).
  322.    int maintainPlan2ID=aiPlanCreate("Maintain 1 "+kbGetProtoUnitName(attackerUnitTypeID2), cPlanTrain);
  323.    if (maintainPlan2ID >= 0)
  324.    {
  325.         //Must set the type of unit to train.
  326.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanUnitType, 0, attackerUnitTypeID2);
  327.       //You can limit the number of units that are ever trained by this plan with this call.
  328.       //aiPlanSetVariableInt(maintainPlanID, cTrainPlanNumberToTrain, 0, 25);
  329.       //Set the number of units to maintain in the world at one time.
  330.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanNumberToMaintain, 0, 2);
  331.      //Don't train units faster than every 40 seconds
  332.       aiPlanSetVariableInt(maintainPlan2ID, cTrainPlanFrequency, 0, 120);
  333.       //Set a gather point.
  334.       aiPlanSetVariableVector(maintainPlan2ID, cTrainPlanGatherPoint, 0, gatherPoint);
  335.       //Activate the plan.
  336.       aiPlanSetActive(maintainPlan2ID);
  337.    }
  338.  
  339.     if ( difflevel > 0 )
  340.     {
  341.         //Maintain ballistae!
  342.         int maintainPlan3ID=aiPlanCreate("Maintain "+kbGetProtoUnitName(cUnitTypeBallista), cPlanTrain);
  343.         if (maintainPlan3ID >= 0)
  344.         {
  345.             //Must set the type of unit to train.
  346.             aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanUnitType, 0, cUnitTypeBallista);
  347.             //Set the number of units to maintain in the world at one time.
  348.             if ( difflevel == 1 )
  349.             {
  350.                 aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanNumberToMaintain, 0, 1);
  351.                 aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanFrequency, 0, 90);
  352.             }
  353.             else if ( difflevel == 2 )
  354.             {
  355.                 aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanNumberToMaintain, 0, 2);
  356.                 aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanFrequency, 0, 60);
  357.             }
  358.             else if ( difflevel == 3 )
  359.             {
  360.                 aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanNumberToMaintain, 0, 3);
  361.                 aiPlanSetVariableInt(maintainPlan3ID, cTrainPlanFrequency, 0, 45);
  362.             }
  363.             //Set a gather point.
  364.             aiPlanSetVariableVector(maintainPlan3ID, cTrainPlanGatherPoint, 0, gatherPoint);
  365.             //Activate the plan.
  366.             aiPlanSetActive(maintainPlan3ID);
  367.         }
  368.     }
  369. }